for(var i=0;i<=5;i++){
  setTimeout(function(){
    console.log(i)
  },1000)
}


// 1.settimeout是异步执行,100ms后往任务队列里面添加一个任务

// 2.let不仅将i绑定到for循环块中，事实上它将其重新绑定到循环体的每一次迭代中

// 3.闭包


// 1：因为用var 定义 i 是属于函数级的作用域，不属于 for 循环体，属于 global。等到 for 循环结束，i 已经等于 5 了，setTimeout函数就会去global中取这个 i 打印出来。
// 2： let 为代码块的作用域，所以每一次 for 循环 console.log(i); 都引用到 for 代码块作用域下的i，因为这样被引用，所以 for 循环结束后，这些作用域在 setTimeout 未执行前都不会被释放。
// 3：let 和 var 最大的区别就是，用var 的时候执行setTimeout函数，因为没有块级作用域的概念。setTimeout函数本身是没有 i 这个变量， 它会去global去找，此时global 中 i 已经是5了
// 4： 而用let 的话因为块级作用域的 i 在setTimeout函数有引用，所以自身有 i 这个变量，当执行 setTimeout函数直接用自己的 i 就行了。

//因为let与var的作用域范围不同，let会对for产生作用域，而var则是全局。
```
for(let i=0;i<=5;i++){
  setTimeout(function(){
    console.log(i)
  },1000)
}
```
```
for (var i = 0; i < 5; i++) {
  (function(i){      //立刻执行函数
   setTimeout(function (){
     console.log(i);
    },1000);
  })(i);
}
```
//闭包
```
for (var i = 0; i < 10; i++) {
  void function (i) {
      setTimeout(() => {
          console.log(i)
      }, i * 1000)
  }(i)
}
```
//限定var的作用范围  setoutTime的第三个参数
```
for (var i = 0; i < 10; i++) {
  setTimeout((j) => {
      console.log(j)
  }, i * 1000, i)
}
```

